package com.ruoyi.web.controller.danger;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.JsonKV;
import com.ruoyi.system.entity.SysDuty;
import com.ruoyi.system.service.SysDutyService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * 履职表(SysDuty)表控制层
 * @since 2022-11-15 14:08:15
 */
@RestController
@RequestMapping("sysDuty")
public class SysDutyController extends BaseController {

    @Resource
    private SysDutyService sysDutyService;

    /**
     * 分页查询
     * @param sysDuty 筛选条件
     * @return 查询结果
     */
    @GetMapping("/list")
    public TableDataInfo queryByPage(SysDuty sysDuty) {
        startPage();
        List<SysDuty> sysDuties = this.sysDutyService.queryByPage(sysDuty);
        return getDataTable(sysDuties);
    }

    /**
     * 通过主键查询单条数据
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public AjaxResult queryById(@PathVariable("id") Integer id) {
        return AjaxResult.success(this.sysDutyService.queryById(id));
    }

    /**
     * 新增数据
     * @param sysDuty 实体
     * @return 新增结果
     */
    @PostMapping("/create")
//    @PreAuthorize("@ss.hasPermi('sysDuty:create')")
    public AjaxResult add(@RequestBody SysDuty sysDuty) {
        String dutyData = sysDuty.getDutyData();
        if (!StringUtils.isEmpty(dutyData)) {
            sysDuty.setDutyData(sysDuty.getDutyDataByDutyType(sysDuty.getDutyType(), sysDuty.getDutyData()));
        }
        String dutyInfoName = sysDuty.getDutyInfoName();
        if (StringUtils.isEmpty(dutyInfoName)) {
            sysDuty.setDutyInfoName(sysDuty.getDutyName(sysDuty.getDutyType()));
        }
        SysDuty duty = new SysDuty();
        duty.setDangerName(sysDuty.getDangerName());
        duty.setDutyInfoName(sysDuty.getDutyInfoName());
        List<SysDuty> sysDuties = this.sysDutyService.queryByPage(duty);
        if (CollUtil.isNotEmpty(sysDuties)) {
            return AjaxResult.error(500,"该负责人已添加过此重大危险源的履职记录");
        }
        return AjaxResult.success(this.sysDutyService.insert(sysDuty));
    }

    /**
     * 编辑数据
     * @return 编辑结果
     */
    @SuppressWarnings("all")
    @PostMapping("/update")
//    @PreAuthorize("@ss.hasPermi('sysDuty:update')")
    public AjaxResult edit(@RequestBody SysDuty sysDuty) {
        SysDuty duty = sysDutyService.queryById(sysDuty.getId());
        if ("超期".equals(duty.getWhetherDelete())) {
            return AjaxResult.error(500,"履职任务已超期，无法进行修改");
        }
        if (StringUtils.isNotEmpty(sysDuty.getDutyData()) && StringUtils.isNotEmpty(duty.getDutyData())) {
            Map<String, String> map = JSON.parseObject(duty.getDutyData(), Map.class);
            Map<String, String> mapResp = JSON.parseObject(sysDuty.getDutyData(), Map.class);
            mapResp.forEach((k, v) -> {
                String string = map.get(k).toString();
                JsonKV jsonKV = JSON.parseObject(string, JsonKV.class);
                if (!jsonKV.getKey().equals(v.toString())) {
                    jsonKV.setKey(v.toString());
                    jsonKV.setValue(DateUtil.now());
                    mapResp.put(k, JSONUtil.toJsonStr(jsonKV));
                }else {
                    jsonKV.setKey(jsonKV.getKey());
                    jsonKV.setValue(jsonKV.getValue());
                    mapResp.put(k, JSONUtil.toJsonStr(jsonKV));
                }
            });
            sysDuty.setDutyData(JSON.toJSONString(mapResp));
        }

        return AjaxResult.success(this.sysDutyService.update(sysDuty));
    }

    /**
     * 删除数据
     * @return 删除是否成功
     */
    @GetMapping("/delete")
//    @PreAuthorize("@ss.hasPermi('sysDuty:delete')")
    public AjaxResult deleteById(Integer id) {
        return AjaxResult.success(this.sysDutyService.deleteById(id));
    }

}

